package main

import	"fmt"

// int类型排序
// func sortIntDesc(slice []int) []int{
// 	for i:=0;i<len(slice);i++{
// 		for j := 0; j < len(slice); j++ {
// 			if slice[i]<slice[j]{
// 				temp :=slice[i]
// 				slice[i]=slice[j]
// 				slice[j]=temp
// 			}
// 		}
// 	}
// 	return slice
// }
//  type calc func(int,int) int //表示定义一个calc的类型

// type myInt  int    //自定义类型

// func add(x,y int)int{
// 	return x+y
// }
// func sub(x,y int) int{
// 	return x-y
// }
// func test(){
// 	fmt.Println("test....")
// }
// func add(x,y int)int{
// 	return x+y
// }
// func sub(x,y int)int{
// 	return x-y
// }
// // 自定义一个方法类型
// type calcType func(int,int) int 

// func calc(x,y int,cb calcType) int{

// 	return cb(x,y)
// }
// 函数作为返回值
func add(x,y int)int{
	return x+y
}
func sub(x,y int) int{
	return x-y
}
// 定义一个函数类型
type calcType func(int,int) int
// 返回一个函数类型
func do(o string) calcType{
	switch o{
	case "+":
		return add 
	case "-":
		return sub
	case "*":
	return func(x,y int) int{
		return x*y

	}
default:
	return nil
	}
}
func main(){
	// 案例1 把前面讲的选择排序封装成方法 实现整形切片的升序降序排列
	// var sliceA =[]int{12,37,35,566,36,2}
	// arr :=sortIntAsc(sliceA)
	// fmt.Println(arr)

	// var sliceB=[]int{1,34,4,35,6,36,2}
	// fmt.Println(sortIntAsc(sliceB))

	// var sliceC =[]int{1,34,4,36,126,36,2}
	// fmt.Println(sortIntDesc(sliceC))
	// fmt.Println(sliceC)

	// var c calc  //定义一个函数类型calc的变量
	// c = sub
	// fmt.Printf("c的类型：%T,c的值:%v\n",c,c) //c的类型main.calc
	// c(10,5)
	// fmt.Println(c(10,5))  //5

	// 推导类型
	// f :=sub  //没有指定类型
	// fmt.Printf("f的类型:%T\n",f)
	// fmt.Println(f(15,5))
	
	// var a int =10
	// var b myInt=20
	// // 
	// 	fmt.Printf("a的类型：%T,b的类型:%T\n",a,b)
	// fmt.Println(a+int(b))  //30
	// sum :=calc(10,5,add)
	// fmt.Println(sum)  //15
	// 	s :=calc(10,5,sub)
	//  fmt.Println(s)  //15

	//  求两个数的积
	// 匿名方法 匿名函数
	// j :=calc(3,4,func(x,y int) int{
	// 	return x * y 
	// })
	// fmt.Println(j)

	var a =do("+")
	// a(12,4)
	fmt.Println(a(12,4))
	b :=do("*")
	// 即相当于把b :=func(x,y int) int{
	// 	return x*y
	fmt.Println(b(3,4))



}